/**
 * @description user路由的控制器
 * @author 印明帝
 */
const { getUserInfo,createUser,deleteUser,updateUser } = require('../service/user')
const { SuccessModel, ErrorModel } = require('../model/ResModel')
const { registerUserNameNotExistInfo,registerFailInfo,loginFailInfo,deleteUserFailInfo,changeInfoFailInfo,changePasswordFailInfo } = require('../model/errorInfo')
const { doCrypto } = require('../utils/cryp')

/**
 * 用户名是否存在
 * @method isExist
 * @param {String} userName 
 * @returns {Object}
 */
async function isExist(userName) {
  //  获取用户信息
  let userInfo = await getUserInfo(userName)
  
  // 判断用户名是否存在
  if(userInfo) {
    return new SuccessModel(userInfo.userName)
  } else {
    return new ErrorModel(registerUserNameNotExistInfo)
  }
}
/**
 * 用户注册
 * @method regitser
 * @param {Object} userInfo 
 * @returns {Object}
 */
async function regitser({ userName,password,gender,nickName }) {
  // 判断用户是否存在
  let user =  await getUserInfo(userName)
  // 如果用户存在抛出错误
  if(user) {
    return new ErrorModel(registerUserNameNotExistInfo)
  }
  
  // 否则调用service层函数创建用户
  try {
    // 加密
    password = doCrypto(password)
    
    // 注册
    await createUser({ userName,password,gender })
    
    return new SuccessModel()
  } catch(e) {
    return new ErrorModel(registerFailInfo)
  }
} 
/**
 * 用户登录
 * @method regitser
 * @param {Object} userInfo 
 * @returns {Object} 
 */
async function login(ctx,{userName,password}) {
  // 加密处理后的密码
  password = doCrypto(password)
  // 查询用户
  let userInfo = await getUserInfo(userName,password)
  
  if(userInfo) {
    // 查询成功后写入session
    if(ctx.session.userInfo === undefined) {
      ctx.session.userInfo = userInfo
    }
    return new SuccessModel()
  } 
  
  return new ErrorModel(loginFailInfo)
}
/**
 * 从session中获取当前用户信息
 * @method getCurUserInfo
 * @param {Object} ctx koa的ctx 
 */
async function getCurUserInfo(ctx) {
  // 如果session里有userInfo
  if(ctx.session && ctx.session.userInfo){
    return new SuccessModel(ctx.session.userInfo)
  }
  // 失败返回没有用户
  return new ErrorModel(registerUserNameNotExistInfo)
}

/**
 * 删除当前用户
 * @method deleteCurUser
 * @param {String} userName 
 * @returns {Object}
 */
async function deleteCurUser(userName) {
  let flag = await deleteUser(userName)
  if(flag) {
    return new SuccessModel()
  }
  return new ErrorModel(deleteUserFailInfo)
}

/**
 * 改变用户信息
 * @method changeUserinfo
 * @param {Object} ctx 
 * @param {Object} oldUserInfo 
 * @param {Object} newUserInfo 
 * @returns {Object}
 */

async function changeUserinfo(ctx,oldUserInfo,newUserInfo) {
  let result = await updateUser(oldUserInfo,newUserInfo)

  if(result) {
    // 修改session的值
    Object.assign(ctx.session.userInfo,newUserInfo)
    return new SuccessModel(result)
  }
  return new ErrorModel(changeInfoFailInfo)
}
/**
 * 改变用户密码
 * @method changeUserinfo
 * @param {*} newPassword 
 */
async function changeUserPassword({ userName,password,newPassword }) {
  // 比较新密码和旧密码是否相同
  if(password === newPassword) {
    return new ErrorModel(changePasswordFailInfo)
  }
  // 修改
  let rusult = await updateUser({ 
    userName,
    password: doCrypto(password)
  },{ 
    password: doCrypto(newPassword)
  })

  // 结果判断
  if(rusult) {
    return new SuccessModel()
  }
  return new ErrorModel(changePasswordFailInfo)
}
/**
 * 退出登录
 * @method logout
 * @param { Object } ctx
 * @returns {Object}
 */
async function logout(ctx) {
  delete ctx.session.userInfo
  return new SuccessModel()
}
module.exports = {
  isExist,
  regitser,
  login,
  getCurUserInfo,
  deleteCurUser,
  changeUserinfo,
  changeUserPassword,
  logout
}